#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cassert>
using namespace std;
//3.如果我们对所有的信号都进行了block，我们是不是写了一个不会被用户和异常杀掉的进程，不是，9号信号是不能block的
void ShowSigPending(sigset_t& pending)
{
    for(int i = 1; i <= 31; i++)
    {
        if(sigismember(&pending,i)) cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}
void handler(int signum)
{
    cout << "我收到了号信号: " << signum << endl; 
}
void blockSig(int sig)
{
    sigset_t bset;
    sigemptyset(&bset);
    sigaddset(&bset,sig);
    int n = sigprocmask(SIG_BLOCK,&bset,nullptr);
    assert(n == 0);
    (void)n;
}
int main()
{
    for(int i = 1; i <= 31; i++)
    {
        blockSig(i);
    }
    sigset_t pending;
    while(true)
    {
        sigpending(&pending);
        ShowSigPending(pending);
        sleep(1);
    }

    return 0;
}



//2.如果我们将2号信号block，并且不断的获取并打印当前进程的pending信号集，如果我们发送一个2号信号
//我们肉眼可以看到pending信号集中，有一个比特位从0变成1
// void ShowSigPending(sigset_t& pending)
// {
//     for(int i = 1; i <= 31; i++)
//     {
//         if(sigismember(&pending,i)) cout << "1";
//         else
//             cout << "0";
//     }
//     cout << endl;
// }
// void handler(int signum)
// {
//     cout << "我收到了号信号: " << signum << endl; 
// }
// void sigsheid(sigset_t& bset,sigset_t& oset)
// {
//     //2.初始化信号集对象
//     sigemptyset(&bset);
//     sigemptyset(&oset);
//     //3.添加要屏蔽的信号
//     sigaddset(&bset,2);
//     //4.设置set到内核中的进程内部[默认情况下进程不会对任何信号进行block]
//     int n = sigprocmask(SIG_BLOCK,&bset,&oset);
    
//     assert(n == 0);
//     (void)n;
//     cout << " block 2 号信号成功... " <<getpid() << endl;
// }
// int main()
// {
//     //0.方便测试对2号信号进行捕捉
//     signal(2,handler);
//     // 1.定于信号集对象
//     sigset_t bset,oset;
//     sigset_t pending;
//     //2.调用信号疲敝
//     sigsheid(bset,oset);
//     //5.重复打印当前进程的pending信号集
//     int count = 0;
//     while(true)//循环进行屏蔽和解除屏蔽
//     {
//         //5.1获取当前进程的pending信号集
//         sigpending(&pending);
//         //5.2显示pending信号集中没有被递达的信号
//         ShowSigPending(pending);
//         sleep(1);
//         count++;

//         if(count % 20 == 0)
//         {
//             //默认情况下，恢复对于2号信号的block的时候，确实会进行递达
//             //但是2号信号默认时终止进程
//             //需要对于2号信号进行捕捉
//             int n = sigprocmask(SIG_UNBLOCK,&bset,nullptr);
//             assert(n == 0);
//             (void)n;
//             cout << "解除对 2 号信号的block " << endl;
//         }
//         if(count % 10 == 0)
//         {
//             cout << " 再次进行 2 号信号屏蔽" <<endl;
//             sigsheid(bset,oset);
//         }

//     }

//     return 0;
// }

//1.如果我们对所有的信号都进行了自定义捕捉--我们是不是写了一个不会被异常或者用户杀掉的进程--不是，9号信号时自定义捕捉不了的
// void callback_t(int signum)
// {
//     cout<< "我收到了一个信号: " << signum <<endl;
// }
// int main()
// {
//     for(int i = 1; i <= 31; i++)
//     {
//         signal(i,callback_t);
//     }

//     while(true) sleep(1);
//     return 0;
// }
